#include"apue.h"
static int msgid_ctos;
static int msgid_stoc;

static Msg_ctos msg_ctos;
static Msg_stoc msg_stoc;

static int flag=0;

void msg_send(void)
{
	if(-1==msgsnd(msgid_ctos,&msg_ctos,sizeof(msg_ctos)-4,0))
	{
		perror("msgsnd");
		_exit(-1);
	}
}
void msg_rcv(void)
{
	if(-1==msgrcv(msgid_stoc,&msg_stoc,sizeof(msg_stoc),msg_stoc.m_type,0))
	{
		perror("msgrcv");
		_exit(-1);
	}
	show_msg(msg_stoc.m_str,3);
}

void show_menu1(void)
{
	clears();
 	puts("╭═════════════════════■□■□══════════╮");  
    puts("│          ZhiZhen  ATM             │");  
    puts("╰════════════■□■□═══════════════════╯");  
	puts("---【1】开户******【2】销户----------");
	puts("---【3】登录******【4】解冻----------");
	puts("---*******【0】退出*********---------");
	puts("-------------------------------------");
}
void show_menu2(void)
{
	clears();
 	puts("╭═════════════════════■□■□══════════╮");  
    puts("│          ZhiZhen  ATM             │");  
    puts("╰════════════■□■□═══════════════════╯");  
	puts("-----【1】存钱******【2】取钱--------");
	puts("-----【3】转帐******【4】查询--------");
	puts("-----【5】修改密码**【0】退出--------");
	puts("-------------------------------------");
}
void open_id(void)
{
	getchar();
	printf("请输入姓名：");
	get_str(msg_ctos.m_cli.name,sizeof(msg_ctos.m_cli.name));


	printf("请输入身份证号码：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	
	printf("请输入预存金额：");
	scanf("%f",&msg_ctos.m_cli.money);
	msg_ctos.m_type=MOPEN;
}
void destroy(void)
{
	getchar();
	printf("请输入要注销的帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);
	getchar();

	printf("请输入要注销的身份证号：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	msg_ctos.m_type=MDESTROY;
}
void unlock(void)
{
	getchar();
	printf("请输入解锁的帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);
	getchar();

	printf("请输入身份证号：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));
	
	msg_ctos.m_type=MUNLOCK;
	
}
void login(void)
{
	getchar();
	printf("请输入帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	msg_ctos.m_type=MLOGIN;

}
void save(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入存款金额:");
	scanf("%f",&msg_ctos.m_cli.money);
	
	msg_ctos.m_type = MSAVE;
}

void take(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入取款金额:");
	scanf("%f",&msg_ctos.m_cli.money);

	msg_ctos.m_type = MTAKE;

}

void look(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	msg_ctos.m_type = MLOOK;
}

void transf(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入要转入的帐号：");
	get_str(msg_ctos.m_cli.otherid,sizeof(msg_ctos.m_cli.otherid));

	printf("请输入转帐金额：");
	scanf("%f",&msg_ctos.m_cli.money);


	msg_ctos.m_type = MTRANSF;
}
void amend(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入旧密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入新密码：");
	get_pwd(msg_ctos.m_cli.otherid,sizeof(msg_ctos.m_cli.otherid));



	msg_ctos.m_type = MAMEND;
}

void main()
{
	msgid_ctos=get_ctos_msg();
	msgid_stoc=get_stoc_msg();

	msg_stoc.m_type=msg_ctos.m_pid=getpid();
 
	while(1)
	{
		show_menu1();
		
		switch(get_cmd('0','4')-'0')
		{
			case MEXIT: return;
			case MOPEN:open_id(); break;
			case MDESTROY:destroy();break;
			case MLOGIN:login();break;
			case MUNLOCK:unlock();break;
		}
		msg_send();
		msg_rcv();
		if(0==strcmp(msg_stoc.m_str,"yes"))
		{
			break;
		}
	}
	while(1)
	{
		show_menu2();
		switch((get_cmd('0','5')-'0')+4)
		{
			case 4: return;
			case MSAVE:save();break;
			case MTAKE:take();break;
			case MTRANSF:transf();break;
			case MLOOK:look();break;
			case MAMEND:amend();break;
		}
		msg_send();
		msg_rcv();

	}

	
}

